new function($) {
    $.fn.getCursorPosition = function() {
        var pos = 0;
        var input = $(this).get(0);
        // IE Support
        if (document.selection) {
            input.focus();
            var sel = document.selection.createRange();
            var selLen = document.selection.createRange().text.length;
            sel.moveStart('character', -input.value.length);
            pos = sel.text.length - selLen;
        }
        // Firefox support
        else if (input.selectionStart || input.selectionStart == '0')
            pos = input.selectionStart;

        return pos;
    }
} (jQuery);

$(document).ready(function(){

	var city_result_count = $(".one_cresult").length;
	var insurer_result_count = $(".one_iresult").length;
	var clist_count = 0;
	var ilist_count = 0;
	var getCity = -1;
	var fast = false;
	var dontOpen = false;
	var Blur = false;

	// калькулятор
	$(".calculator").click(function(e){
		$(".calc_list").fadeIn(200);
		e.stopPropagation();
	});
	$("*").not(".calculator").click(function(){
		$(".calc_list").fadeOut(200);
	})

	// Список городов в окне
	$("#choose_btn").click(function(e){
		$(".city_box").fadeIn(300);
		e.stopPropagation();
	})
	$("*").not("#choose_btn").click(function(){
		$(".city_box").fadeOut(200);
	})

	// события поиска
	$("#find-city-hidden").focus(function(){ // IE 7,8 hacks
		$("#find-city").focus();
	})
	$("#find-insurer-hidden").focus(function(){ // IE 7,8 hacks
		$("#find-insurer").focus();
	})
	$("#find-city").focus(function(){
		if ($(this).val() == '')
			$("#find-city-hidden").val("");
		$("#find-city-hidden").css("color","#d6d6d6");
		$(".insurer_result").hide();
		if (city_result_count > 1 && !dontOpen)
			$(".city_result").show();
	})
	$("#find-city").blur(function(){
		$(this).val($("#find-city-hidden").val());

		if ($(this).val() == ''){
			$("#find-city-hidden").val("Город");
			$("#find-city-hidden").css("color","#878787");
		}
	})
	$("#find-insurer").focus(function(){
		
        if ($(this).val() == '')
			$("#find-insurer-hidden").val("");
		$("#find-insurer-hidden").css("color","#d6d6d6");
		$(".city_result").hide();

		if (!dontOpen)
			$("#find-insurer").keyup();

		if (insurer_result_count > 1 && !dontOpen)
			$(".insurer_result").show();
	})
	$("#find-insurer").blur(function(){
		$(this).val($("#find-insurer-hidden").val());

		if ($(this).val() == ''){
			$("#find-insurer-hidden").val("Страховщик");
			$("#find-insurer-hidden").css("color","#878787");
		}
	})
	// hide search results by click anywhere
	$(".center *:not(.search,.main_page_center,.search *)").click(function(){
		$(".city_result").hide();
		$(".insurer_result").hide();
	})
	// поиск городов
	$("#find-city").keydown(function(event){
		if (event.keyCode == "13")
		{
			// выбираем элемент списка
			if (getCity != -1 || getCity == city_result_count-1)
			{
				dontOpen = true;
				$("#find-city").val($(".one_cresult.hovered").text());
			}
			else // дописываем
			{
				if ($("#find-city-hidden").val() != "")
				{
					dontOpen = true;
					$(this).val($("#find-city-hidden").val());
					$(".city_result").hide();
				}
			}
			return false;
		}
		else if (event.keyCode == '39') // дописываем
		{
			if ($(this).getCursorPosition() == $(this).val().length && $("#find-city-hidden").val() != '')
			{
				dontOpen = true;
				$("#find-city").val($("#find-city-hidden").val());
			}
		}
	})


	$("#find-city").keyup(function(event){

		// листаем вверх
		if (event.keyCode == '38')
		{
			if (getCity > 0)
			{
				getCity--;

				if (getCity < clist_count)
				{
					clist_count = getCity + 1;
					$("#up_city_button").click();
				}
				else if (getCity > clist_count + 5)
				{
					clist_count = getCity - 4;
					$("#up_city_button").click();
				}
			}
			else
				getCity = city_result_count-1;
			$(".one_cresult").removeClass("hovered");
			$(".one_cresult:eq("+getCity+")").addClass("hovered");
		}
		// листаем вниз
		else if (event.keyCode == '40')
		{
			if (getCity < city_result_count-2)
			{
				getCity++;

				if (getCity > clist_count + 5)
				{
					clist_count = getCity - 6;
					$("#down_city_button").click();
				}
				else if (getCity < clist_count)
				{
					clist_count = getCity - 1;
					$("#down_city_button").click();
				}
			}
			else
				getCity = -1;
			$(".one_cresult").removeClass("hovered");
			$(".one_cresult:eq("+getCity+")").addClass("hovered");
		}
		else
		{
			$.ajax({
					url: "/ajax/find_city?city="+encodeURIComponent($(this).val()),
					success: function(data){
						$(".one_cresult").remove();
						if (data)
						{
							req = $.parseJSON(data);

							// забиваем подсказку
							if (!Blur)
								$("#find-city-hidden").val(req[0].tip);
							Blur  = false;

							city_result_count = req.length;

							// забиваем список
							for (var i=1; i<city_result_count; i++ )
								$(".cr").append("<div class='one_cresult'>"+req[i].name+"</div>");

							// показываем кнопки вверх-вниз
							if (city_result_count > 6)
							{
								$("#up_city_button").hide();
								$("#down_city_button").show();
							}
							else
							{
								$("#up_city_button").hide();
								$("#down_city_button").hide();
							}

							// поднимаем список найденого
							$(".cr").css("margin-top","0");
							clist_count = getCity = -1;

							// раскрываем список
							if (city_result_count > 1)
							{
								// если не выбрали елемент то показываем список
								if (!dontOpen)
									$(".city_result").show();
								else
									$(".city_result").hide();
							}
							else
								$(".city_result").hide();
						}
						else
							$(".city_result").hide();
						dontOpen = false;
					}
			})
		}
	})
	$(".one_cresult").click(function(){
		$("#find-city").val($(this).text());
		dontOpen = true;
		$("#find-city").keyup();
		$("#find-city").focus();
	});

	// задаем события
	$(".one_cresult").live("click",function(){
		$("#find-city").val($(this).text());
		dontOpen = true;
		$("#find-city").keyup();
		$("#find-city").focus();
		setTimeout(function(){$(".city_result").hide()},50);
	});
	$(".one_cresult").live("mousemove",function(){
		getCity = $(".one_cresult").index(this);
		$(".one_cresult").removeClass("hovered");
		$(".one_cresult:eq("+getCity+")").addClass("hovered");
	});
	$(".one_cresult").live("mousewheel",function(e,d){
		fast = true;
		if (d > 0)
			$("#up_city_button").click();
		else
			$("#down_city_button").click();
		fast = false;
	});

	var getInsurer = -1;
	// поиск страховщиков
	$("#find-insurer").keydown(function(event){
        if (event.keyCode == "13")
		{
			// выбираем элемент списка
			if (getInsurer != -1 || getInsurer == insurer_result_count-1)
			{
				dontOpen = true;
				$("#find-insurer").val($(".one_iresult.hovered").text());
				return false;
			}
			elseif ($(this).val() != $("#find-insurer-hidden").val()) // дописываем
			{
				if ($("#find-insurer-hidden").val() != "")
				{
					dontOpen = true;
					$(this).val($("#find-insurer-hidden").val());
					$(".insurer_result").hide();
				}
				return false;
			}
		}
		else if (event.keyCode == '39') // дописываем
		{
			if ($(this).getCursorPosition() == $(this).val().length && $("#find-insurer-hidden").val() != '')
			{
				dontOpen = true;
				$("#find-insurer").val($("#find-insurer-hidden").val());
			}
		}
	})

	// поиск страховщиков
	$("#find-insurer").keyup(function(event){
        
		// листаем вверх
		if (event.keyCode == '38')
		{
			if (getInsurer > 0)
			{
				getInsurer--;
				if (getInsurer < ilist_count)
				{
					ilist_count = getInsurer + 1;
					$("#up_insurer_button").click();
				}
				else if (getInsurer > ilist_count + 5)
				{
					ilist_count = getInsurer - 4;
					$("#up_insurer_button").click();
				}
			}
			else
				getInsurer = insurer_result_count-1;
			$(".one_iresult").removeClass("hovered");
			$(".one_iresult:eq("+getInsurer+")").addClass("hovered");
		}
		// листаем вниз
		else if(event.keyCode == '40')
		{
			if (getInsurer < insurer_result_count-2)
			{
				getInsurer++;

				if (getInsurer > ilist_count + 5)
				{
					ilist_count = getInsurer - 6;
					$("#down_insurer_button").click();
				}
				else if (getInsurer < ilist_count)
				{
					ilist_count = getInsurer - 1;
					$("#down_insurer_button").click();
				}
			}
			else
				getInsurer = -1;
			$(".one_iresult").removeClass("hovered");
			$(".one_iresult:eq("+getInsurer+")").addClass("hovered");
		}
		else
		{
			$.ajax({
					url: "/ajax/find_insurer?insurer="+encodeURIComponent($(this).val())+"&city="+encodeURIComponent($("#find-city").val()),
					success: function(data){
						$(".one_iresult").remove();
						if (data)
						{
							req = $.parseJSON(data);

							// забиваем подсказку
							if (!Blur)
								$("#find-insurer-hidden").val(req[0].tip);
							Blur  = false;

							insurer_result_count = req.length;

							// забиваем список
							for (var i=1; i<insurer_result_count; i++ )
								$(".ir").append("<div class='one_iresult'>"+req[i].name+"</div>");

							// показываем кнопки вверх-вниз
							if (insurer_result_count > 6)
							{
								$("#up_insurer_button").hide();
								$("#down_insurer_button").show();
							}
							else
							{
								$("#up_insurer_button").hide();
								$("#down_insurer_button").hide();
							}

							// поднимаем список найденого
							$(".ir").css("margin-top","0");
							ilist_count = getInsurer = -1;

							// раскрываем список
							if (insurer_result_count > 1)
							{
								// если не выбрали елемент то показываем список
								if (!dontOpen)
									$(".insurer_result").show();
								else
									$(".insurer_result").hide();
							}
							else
								$(".insurer_result").hide();
						}
						else
							$(".insurer_result").hide();
						dontOpen = false;
					}
			})
		}
	})
	$(".one_iresult").click(function(){
		$("#find-insurer").val($(this).text());
		dontOpen = true;
		$("#find-insurer").keyup();
		$("#find-insurer").focus();
	});

	// задаем события
	$(".one_iresult").live("click",function(){
		$("#find-insurer").val($(this).text());
		dontOpen = true;
		$("#find-insurer").keyup();
		$("#find-insurer").focus();
	});
	$(".one_iresult").live("mousemove",function(){
		getInsurer = $(".one_iresult").index(this);
		$(".one_iresult").removeClass("hovered");
		$(".one_iresult:eq("+getInsurer+")").addClass("hovered");
	});
	$(".one_iresult").live("mousewheel",function(e,d){
		fast = true;
		if (d > 0)
			$("#up_insurer_button").click();
		else
			$("#down_insurer_button").click();
		fast = false;
	});

	$("#up_city_button").click(function(e){
		if (clist_count > 0)
		{
			clist_count--;
			if (fast)
				$(".cr").animate({"margin-top":"-"+(clist_count*44)+"px"},20);
			else
				$(".cr").animate({"margin-top":"-"+(clist_count*44)+"px"},150);
		}
		if (city_result_count > 6)
		{
			if (clist_count == 0)
			{
				$("#up_city_button").hide();
				$("#down_city_button").show();
			}
			else if (clist_count == city_result_count - 7)
			{
				$("#up_city_button").show();
				$("#down_city_button").hide();
			}
			else
			{
				$("#up_city_button").show();
				$("#down_city_button").show();
			}
		}
		$("#find-city").focus();
	})

	$("#down_city_button").click(function(e){
		if (clist_count < city_result_count-7)
		{
			clist_count++;
			if (fast)
				$(".cr").animate({"margin-top":"-"+(clist_count*44)+"px"},20);
			else
				$(".cr").animate({"margin-top":"-"+(clist_count*44)+"px"},150);
		}
		if (city_result_count > 6)
		{
			if (clist_count == 0)
			{
				$("#up_city_button").hide();
				$("#down_city_button").show();
			}
			else if (clist_count == city_result_count - 7)
			{
				$("#up_city_button").show();
				$("#down_city_button").hide();
			}
			else
			{
				$("#up_city_button").show();
				$("#down_city_button").show();
			}
		}
		$("#find-city").focus();
	})

	$("#up_insurer_button").click(function(){
		console.log(ilist_count,insurer_result_count);
		if (ilist_count > 0) {
			ilist_count--;
			if (fast)
				$(".ir").animate({"margin-top":"-"+(ilist_count*44)+"px"},20);
			else
				$(".ir").animate({"margin-top":"-"+(ilist_count*44)+"px"},150);
		}
		if (insurer_result_count > 6) {
			if (ilist_count == 0) {
				$("#up_insurer_button").hide();
				$("#down_insurer_button").show();
			} else if (ilist_count == insurer_result_count - 7) {
				$("#up_insurer_button").show();
				$("#down_insurer_button").hide();
			} else {
				$("#up_insurer_button").show();
				$("#down_insurer_button").show();
			}
		}
		$("#find-insurer").focus();
	})

	$("#down_insurer_button").click(function(){
		console.log(ilist_count,insurer_result_count);
		if (ilist_count < insurer_result_count-7) {
			ilist_count++;
			if (fast)
				$(".ir").animate({"margin-top":"-"+(ilist_count*44)+"px"},20);
			else
				$(".ir").animate({"margin-top":"-"+(ilist_count*44)+"px"},150);
		}
		if (insurer_result_count > 6) {
			if (ilist_count == 0) {
				$("#up_insurer_button").hide();
				$("#down_insurer_button").show();
			} else if (ilist_count == insurer_result_count - 7) {
				$("#up_insurer_button").show();
				$("#down_insurer_button").hide();
			} else {
				$("#up_insurer_button").show();
				$("#down_insurer_button").show();
			}
		}
        dontOpen = true;
		$("#find-insurer").focus();
	})

	$("#ldarr").click(function(){
		if ($(".one_cresult").length != 0)
			$(".city_result").show(0);
		$("#find-city").focus();
	})
	$("#luarr").click(function(){
		$(".city_result").hide(0);
	})
	$("#rdarr").click(function(){
		if ($(".one_iresult").length != 0)
			$(".insurer_result").show(0);
		$("#find-insurer").focus();
	})
	$("#ruarr").click(function(){
		$(".insurer_result").hide(0);
	})
});